//modified from original vendors example
//Ir the IRrmote from keyestudio did not work for me (indicated Invalid lib )so..
//I had to used the Ken Shirriff IRremote lib
//but first i move the conflicting lib RobotIRremote to some other folder
//https://github.com/z3t0/Arduino-IRremote/releases  It was called Arduino-IRremote-dev.zip 
//I tested just the the Ir with the example IR RecvDemo with pin6 instead of pint11, it worked
//No PressingDefault is IR remote  Press SW1 for flag0=blinking   SW2 for flag1=Analog readings
// the buzzer part was commented out so it does not scare anyone
// if you cannot handle blinking lights dont press SW1

#include <IRremote.h>
#include <dht11.h>
dht11 DHT;
#define DHT11_PIN 4

//buzzer pin
int buzzer = 5;

//button pins
int KEY2 = 2;
int KEY3 = 3;

//pin definition of flowing light
int led5 = 13;
int led4 = 12;
int led3 = 11;
int led2 = 10;
int led1 = 9;

int RECV_PIN = 6; //define input pin on Arduino
 IRrecv irrecv(RECV_PIN);
 decode_results results;

char i=0,flag=2,lastflag=9,irHeadingOnce=1;
int LastDHT_H=0,LastDHT_T=0; 


void setup ()
{
  Serial.begin(9600);

  irrecv.enableIRIn(); // Start the receiver

  attachInterrupt(0, falling0, FALLING);
  attachInterrupt(1, falling1, FALLING);

  pinMode(buzzer,OUTPUT);
  digitalWrite(buzzer,HIGH);

  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(led3,OUTPUT); 
  pinMode(led4,OUTPUT);
  pinMode(led5,OUTPUT);
  for(char i=9;i<14;i++)
   digitalWrite(i,LOW);    
}


//No PressingDefault is IR remote  Press SW1 for flag0=blinking   SW2 for flag1=Analog readings
void loop()
{
   if(flag!=lastflag)
     {       
     Serial.print("flag");
     Serial.println(int(flag));
     lastflag=flag;
     }
  if(flag==0)
  {
  //bz buzzer_();           //testing buzzer  commented too noisey
  led_display();            //testing LED
  }

  
  if(flag==1)
  { 
  //Serial.println("status,  Hum(%),  Tem(C)      analog_val      light_val     lm35_val");


  Serial.print("  Analog:");
  analog();                //testing analog input
  Serial.print("  Light: ");
  Light();
  Serial.print(" TempLM35: ");
  LM35();
  Serial.print("F  ");
  //Move DHT11 at end because discovered it need none buffer time between Serial command
  Serial.print("  DHT11:");
  delay(100); //Yes needed    or TO error
  DHT11();
  delay(1200);//Yes needed    or TO error 900 will not work needs 1sec before you interupt with a Serial cm
  Serial.println("");
  
//  delay(1000);
  }
  if(flag!=0 & flag!=1)
  {
     if(irHeadingOnce==1) // so only prints once
     {       
        Serial.println("IR section wait for remote button press");
        irHeadingOnce=0;
     }   
    if (irrecv.decode(&results))
     {
      Serial.print("IR detected:  ");
      Serial.println(results.value, HEX);
      irrecv.resume(); // Receive the next value   
     }  
   }
 }

//Humidity 20-80%RH 5% and TempC 0-50degC +/-2degC
//Getting Timeout after a valid read and sometimes Checksum when moving around windows
//so will make last reading for these cases until i can understand the driver files

void DHT11()
{
int chk;
int H_offset=6; //use two other humidity indicators
int T_offset=-2;// used two other temperture indicators
int DHT_h,DHT_t;
chk = DHT.read(DHT11_PIN);    // READ DATA
DHT_h=DHT.humidity+H_offset;
DHT_t=DHT.temperature+T_offset;
switch (chk)
  {
    case DHTLIB_OK:  
                Serial.print("OK        "); 
                Serial.print(DHT_h,1);
                Serial.print("%RH ");
                Serial.print(DHT_t,1);
                Serial.print("C");
                LastDHT_H=DHT_h;
                LastDHT_T=DHT_t;
                break;
    case DHTLIB_ERROR_CHECKSUM: 
               // Serial.print("Checksum error        "); 
                Serial.print("CS        "); 
                Serial.print(LastDHT_H,1);
                Serial.print("%RH ");
                Serial.print(LastDHT_T,1);
                Serial.print("C");
                
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                //Serial.print("                 "); 
                //Serial.print("Time out error        ");
                Serial.print("TO        "); 
                Serial.print(LastDHT_H,1);
                Serial.print("%RH ");
                Serial.print(LastDHT_T,1);
                Serial.print("C"); 
                break;
    default: 
                Serial.print("Unknown error         "); 
                break;
  }
}

void buzzer_(void)
{
 char i;  
 for(i=0;i<80;i++)// output a frequency sound
 { 
  digitalWrite(buzzer,LOW);// sound
  delay(1);//delay1ms 
  digitalWrite(buzzer,HIGH);//not sound
  delay(1);//ms delay 
 } 
 for(i=0;i<100;i++)// output a frequency sound
 { 
  digitalWrite(buzzer,LOW);// sound
  digitalWrite(buzzer,HIGH);//not sound
  delay(2);//2ms delay 
 }
}

void led_display()
{
 digitalWrite(led1,HIGH);
 delay(500);
 digitalWrite(led1,LOW);
 digitalWrite(led2,HIGH);
 delay(500);
 digitalWrite(led2,LOW);
 digitalWrite(led3,HIGH);
 delay(500);
 digitalWrite(led3,LOW);
 digitalWrite(led4,HIGH);
 delay(500);
 digitalWrite(led4,LOW);
 digitalWrite(led5,HIGH);
 delay(500);
 digitalWrite(led5,LOW);
}

void analog()
{
int val;
val=analogRead(A0);
Serial.print(val);
}

void Light()
{
int val;
val=analogRead(A1);
Serial.print(val);
}

void LM35()
{
float val;
float sumval;
int avgnum=20;
float offset=-4.8; //Use your own small offset to calibrate.
for (int i = 0; i <= avgnum; i++) 
 {
 sumval=sumval + analogRead(A2)*0.4882;
 }
 val=(sumval/avgnum)*9/5 + 32 + offset;
Serial.print(val,0);
}

void falling0()
{
flag=0;
}
void falling1()
{
flag=1;
}
